package cfdt.common.vo;

import cfdt.common.enums.ICodeEnum;
import cfdt.common.exception.CodeException;
import cfdt.common.utils.CommonUtils;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 对象返回类
 * @param <T> 返回对象
 *
 * @author sven.wang
 * @since 2025/8/22 15:21
 */
@Schema(description = "返回对象")
@EqualsAndHashCode(callSuper = true)
@Data
public class ObjectBaseResponse<T> extends BaseResponse {

    @Schema(description = "业务数据对象")
    private T data;

    public ObjectBaseResponse() {
    }

    /**
     * 错误响应创建，响应码直接创建
     * </br> 业务逻辑禁止使用，统一使用枚举创建
     *
     * @param code 响应码
     * @param message 响应码提示信息
     */
    public ObjectBaseResponse(String code, String message) {
        this.setCode(code);
        this.setMessage(message);
    }

    public ObjectBaseResponse(T data) {
        this.setData(data);
    }

    /**
     * 创建成功返回对象
     * @param <T> 返回对象类型
     * @return 成功返回对象
     */
    public static <T> ObjectBaseResponse<T> success() {
        return new ObjectBaseResponse<>();
    }

    /**
     * 创建成功返回对象
     * @param <T> 响应对象类型
     * @param data 响应对象
     * @return 成功返回对象
     */
    public static <T> ObjectBaseResponse<T> success(T data) {
        return new ObjectBaseResponse<>(data);
    }

    /**
     * 响应失败
     * @param codeEnum 错误码枚举
     * @return 响应结果
     */
    public static <T> ObjectBaseResponse<T> error(ICodeEnum codeEnum) {
        return new ObjectBaseResponse<>(codeEnum.getCode(), codeEnum.getDesc());
    }

    /**
     * 响应失败
     * @param codeEnum 错误码枚举
     * @param errorArgs 错误参数
     * @return 响应结果
     */
    public static <T> ObjectBaseResponse<T> error(ICodeEnum codeEnum, Object... errorArgs) {
        return new ObjectBaseResponse<>(codeEnum.getCode(), CommonUtils.getCodeMessage(codeEnum.getDesc(), errorArgs));
    }

    /**
     * 响应失败
     * @param codeException 业务里的Code异常
     * @return 响应结果
     */
    public static <T> ObjectBaseResponse<T> error(CodeException codeException) {
        return new ObjectBaseResponse<>(codeException.getCode(), codeException.getMessage());
    }

    /**
     * 检查响应并获取数据
     * @return 数据
     */
    public T checkAndGetData() {
        CommonUtils.dealResponse(this);
        return data;
    }


}
